home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 …ember: Reference Library / Apple Developer Reference Library (December 1999) (Disk 1).iso / pc / technical documentation / macintosh technotes and q&as / technotes / tn / tn1120.hqx / TestOpenResFile.1 / TestOpenResFile.p < prev    next >
Encoding:
Text File  |  1999-07-20  |  9.6 KB  |  370 lines

  1. program TestOpenResFile;
  2.  
  3. (*
  4.     File:        TestOpenResFile.c
  5.  
  6.     Contains:    Tests the rules for the Resource Manager's open routines.
  7.  
  8.     Written by:    Quinn "The Eskimo!"
  9.  
  10.     Copyright:    © 1997 by Apple Computer, Inc., all rights reserved.
  11.  
  12.     Change History (most recent first):
  13.  
  14.     You may incorporate this sample code into your applications without
  15.     restriction, though the sample code has been provided "AS IS" and the
  16.     responsibility for its operation is 100% yours.  However, what you are
  17.     not permitted to do is to redistribute the source as "DSC Sample Code"
  18.     after having made changes. If you're going to re-distribute the source,
  19.     we require that you make it clear in the source that the code was
  20.     descended from Apple Sample Code, but that you've made changes.
  21. *)
  22.  
  23.     uses
  24.         Types,
  25.         Files,
  26.         LowMem,
  27.         GestaltEqu;
  28.  
  29.     procedure Assert(mustBeTrue : Boolean);
  30.     begin
  31.         if not mustBeTrue then begin
  32.             DebugStr('Assert: Assertion failed.');
  33.         end; (* if *)
  34.     end; (* Assert *)
  35.     
  36.     type
  37.         OpenResFileRoutine = (
  38.                 kOpenResFile,
  39.                 kOpenRFPerm,
  40.                 kHOpenResFile,
  41.                 kFSpOpenResFile
  42.             );
  43.     
  44.     function OpenResFileRoutineToString(routine : OpenResFileRoutine) : Str31;
  45.     begin
  46.         case routine of
  47.             kOpenResFile :
  48.                 OpenResFileRoutineToString := 'kOpenResFile';
  49.             kOpenRFPerm :
  50.                 OpenResFileRoutineToString := 'kOpenRFPerm';
  51.             kHOpenResFile :
  52.                 OpenResFileRoutineToString := 'kHOpenResFile';
  53.             kFSpOpenResFile :
  54.                 OpenResFileRoutineToString := 'kFSpOpenResFile';
  55.         end; (* case *)
  56.     end; (* OpenResFileRoutineToString *)
  57.     
  58.     function FSPermToString(perm : ByteParameter) : Str31;
  59.     begin
  60.         case perm of
  61.             fsCurPerm :
  62.                 FSPermToString := 'fsCurPerm';
  63.             fsRdPerm :
  64.                 FSPermToString := 'fsRdPerm';
  65.             fsWrPerm :
  66.                 FSPermToString := 'fsWrPerm';
  67.             fsRdWrPerm :
  68.                 FSPermToString := 'fsRdWrPerm';
  69.         end; (* case *)
  70.     end; (* FSPermToString *)
  71.     
  72. {$PUSH}
  73. {$ALIGN MAC68K}
  74.     type
  75.         ResourceMapHandle = ^ResourceMapPtr;
  76.         ResourceMapPtr = ^ResourceMap;
  77.         ResourceMap =
  78.             record
  79.                 junk : packed array [0..15] of Byte;
  80.                 next : ResourceMapHandle;
  81.                 fileRefNum : integer;
  82.             end;
  83. {$ALIGN RESET}
  84. {$POP}
  85.     const
  86.         kSystemResourceFileRefNum = 2;
  87.         kROMResourceBogusFileRefNum = 3;
  88.     
  89.     type
  90.         DumpResourceChainStyle = (kShortDump, kLongDump);
  91.  
  92.     procedure DumpResourceChain(style : DumpResourceChainStyle);
  93.         var
  94.             currentMap : ResourceMapHandle;
  95.             fcbPB : FCBPBRec;
  96.             fileNameString : Str255;
  97.             arrowStr : Str31;
  98.     begin
  99.         writeln('DumpResourceChain');
  100.         currentMap := ResourceMapHandle(LMGetTopMapHndl);
  101.         while currentMap <> nil do begin
  102.             if currentMap^^.fileRefNum = CurResFile then begin
  103.                 arrowStr := '>'
  104.             end else begin
  105.                 arrowStr := ' ';
  106.             end; (* if *)
  107.             write('  ', arrowStr, ' fileRefNum = ', currentMap^^.fileRefNum:6);
  108.             fcbPB.ioNamePtr := @fileNameString;
  109.             fcbPB.ioVRefNum := 0;
  110.             fcbPB.ioRefNum := currentMap^^.fileRefNum;
  111.             fcbPB.ioFCBIndx := 0;
  112.             if PBGetFCBInfoSync(@fcbPB) = noErr then begin
  113.                 if btst(fcbPB.ioFCBFlags, 8) then begin
  114.                     write(' R/W');
  115.                 end else begin
  116.                     write(' R-O');
  117.                 end; (* if *)
  118.                 writeln('  ', fileNameString);
  119.             end else if currentMap^^.fileRefNum = kROMResourceBogusFileRefNum then begin
  120.                 writeln(' xxx  ROM Resources');
  121.             end else begin
  122.                 writeln;
  123.             end; (* if *)
  124.             
  125.             if (style = kShortDump) and (currentMap^^.fileRefNum = kSystemResourceFileRefNum) then begin
  126.                 leave;
  127.             end; (* if *)
  128.             
  129.             currentMap := currentMap^^.next;
  130.         end; (* while *)
  131.         writeln;
  132.     end; (* DumpResourceChain *)
  133.     
  134.     var
  135.         gApplicationResFile : integer;
  136.     
  137.     procedure CloseExtraResourceFiles;
  138.         var
  139.             done : Boolean;
  140.             currentMap : ResourceMapHandle;
  141.     begin
  142.         writeln('CloseExtraResourceFiles');
  143.         repeat
  144.             currentMap := ResourceMapHandle(LMGetTopMapHndl);
  145.             Assert(currentMap <> nil);
  146.             done := (currentMap^^.fileRefNum = gApplicationResFile);
  147.             if not done then begin
  148.                 writeln('  Closing ', currentMap^^.fileRefNum);
  149.                 CloseResFile(currentMap^^.fileRefNum);
  150.             end; (* if *)
  151.         until done;
  152.         writeln;
  153.     end; (* DumpResourceChain *)
  154.     
  155.     function MyOpenResFile(routine : OpenResFileRoutine; perm : ByteParameter; name : Str63;
  156.                                 var resourceRefNum : integer) : OSStatus;
  157.         var
  158.             err : OSStatus;
  159.             tmpFSS : FSSpec;
  160.             junk : OSErr;
  161.     begin
  162.         writeln('  Opening ', name);
  163.         case routine of
  164.             kOpenResFile :
  165.                 begin
  166.                     Assert(perm = fsCurPerm);
  167.                     resourceRefNum := OpenResFile(name);
  168.                     err := ResError;
  169.                 end;
  170.             kOpenRFPerm :
  171.                 begin
  172.                     resourceRefNum := OpenRFPerm(name, 0, perm);
  173.                     err := ResError;
  174.                 end;
  175.             kHOpenResFile :
  176.                 begin
  177.                     resourceRefNum := HOpenResFile(0, 0, name, perm);
  178.                     err := ResError;
  179.                 end;
  180.             kFSpOpenResFile :
  181.                 begin
  182.                     junk := FSMakeFSSpec(0, 0, name, tmpFSS);
  183.                     resourceRefNum := FSpOpenResFile(tmpFSS, perm);
  184.                     err := ResError;
  185.                 end;
  186.         end; (* case *)
  187.         writeln('  err = ', err:1, ' resourceRefNum = ', resourceRefNum:1);
  188.         MyOpenResFile := err;
  189.     end; (* MyOpenResFile *)
  190.     
  191.     procedure TestOpenResFileSingleProcess(routine : OpenResFileRoutine; perm1, perm2 : ByteParameter);
  192.         var
  193.             err : OSStatus;
  194.             resourceRefNum : integer;
  195.     begin
  196.         writeln('TestOpenResFileSingleProcess ', OpenResFileRoutineToString(routine), ' ', FSPermToString(perm1), ' ', FSPermToString(perm2));
  197.         
  198.         err := MyOpenResFile(routine, perm1, 'File A', resourceRefNum);
  199.         
  200.         if err = noErr then begin
  201.             err := MyOpenResFile(kHOpenResFile, fsRdPerm, 'File B', resourceRefNum);
  202.         end; (* if *)
  203.  
  204.         if err = noErr then begin
  205.             err := MyOpenResFile(routine, perm2, 'File A', resourceRefNum);
  206.             DumpResourceChain(kShortDump);
  207.         end; (* if *)
  208.  
  209.         CloseExtraResourceFiles;
  210.         
  211.         if err = noErr then begin
  212.             writeln('  Success!');
  213.         end else begin
  214.             writeln('  Failed with error ', err:1, '!');
  215.         end; (* if *)
  216.         writeln;
  217.         writeln;
  218.     end; (* TestOpenResFileSingleProcess *)
  219.  
  220.     procedure SingleProcessTest;
  221.         var
  222.             routine : OpenResFileRoutine;
  223.             perm1 : integer;
  224.             perm2 : integer;
  225.     begin
  226.         writeln('Single Process Test');
  227.         writeln('-------------------');
  228.         writeln;
  229.         for routine := kOpenResFile to kFSpOpenResFile do begin
  230.             for perm1 := fsCurPerm to fsRdWrPerm do begin
  231.                 for perm2 := fsCurPerm to fsRdWrPerm do begin
  232.                     if (routine = kOpenResFile) and ((perm1 <> fsCurPerm) or (perm2 <> fsCurPerm)) then begin
  233.                         (* test skipped *)
  234.                     end else begin
  235.                         TestOpenResFileSingleProcess(routine, perm1, perm2);
  236.                     end; (* if *)
  237.                 end; (* for *)
  238.             end; (* for *)
  239.         end; (* for *)
  240.     end; (* SingleProcessTest *)
  241.     
  242.     procedure PassiveDoubleProcessTest;
  243.         var
  244.             err : OSStatus;
  245.             resourceRefNum : integer;
  246.     begin
  247.         writeln('Passive Double Process Test');
  248.         writeln('---------------------------');
  249.         writeln;
  250.         err := MyOpenResFile(kFSpOpenResFile, fsCurPerm, 'File A', resourceRefNum);
  251.         if err = noErr then begin
  252.             err := MyOpenResFile(kFSpOpenResFile, fsRdPerm, 'File B', resourceRefNum);
  253.         end; (* if *)
  254.         if err = noErr then begin
  255.             err := MyOpenResFile(kFSpOpenResFile, fsWrPerm, 'File C', resourceRefNum);
  256.         end; (* if *)
  257.         if err = noErr then begin
  258.             err := MyOpenResFile(kFSpOpenResFile, fsRdWrPerm, 'File D', resourceRefNum);
  259.         end; (* if *)
  260.         DumpResourceChain(kShortDump);
  261.         
  262.         if err = noErr then begin
  263.             writeln('Files are opened.');
  264.             writeln('Hit return to continue.');
  265.             readln;
  266.         end; (* if *)
  267.         
  268.         CloseExtraResourceFiles;
  269.         
  270.         if err = noErr then begin
  271.             writeln('  Success!');
  272.         end else begin
  273.             writeln('  Failed with error ', err:1, '!');
  274.         end; (* if *)
  275.         writeln;
  276.         writeln;
  277.     end; (* PassiveDoubleProcessTest *)
  278.  
  279.     procedure TestOpenResFileDoubleProcess(routine : OpenResFileRoutine; perm1, perm2 : ByteParameter);
  280.         var
  281.             err : OSStatus;
  282.             resourceRefNum : integer;
  283.             fileName : Str63;
  284.     begin
  285.         writeln('TestOpenResFileDoubleProcess ', OpenResFileRoutineToString(routine), ' ', FSPermToString(perm1), ' ', FSPermToString(perm2));
  286.         
  287.         fileName := concat('File ', chr( ord('A') + ord(perm1) ) );
  288.         
  289.         err := MyOpenResFile(routine, perm2, fileName, resourceRefNum);
  290.         
  291.         DumpResourceChain(kShortDump);
  292.  
  293.         CloseExtraResourceFiles;
  294.         
  295.         if err = noErr then begin
  296.             writeln('  Success!');
  297.         end else begin
  298.             writeln('  Failed with error ', err:1, '!');
  299.         end; (* if *)
  300.         writeln;
  301.         writeln;
  302.     end; (* TestOpenResFileDoubleProcess *)
  303.  
  304.     procedure ActiveDoubleProcessTest;
  305.         var
  306.             routine : OpenResFileRoutine;
  307.             perm1 : integer;
  308.             perm2 : integer;
  309.     begin
  310.         writeln('Active Double Process Test');
  311.         writeln('--------------------------');
  312.         writeln;
  313.         
  314.         for routine := kOpenResFile to kFSpOpenResFile do begin
  315.             for perm1 := fsCurPerm to fsRdWrPerm do begin
  316.                 for perm2 := fsCurPerm to fsRdWrPerm do begin
  317.                     if (routine = kOpenResFile) and ((perm1 <> fsCurPerm) or (perm2 <> fsCurPerm)) then begin
  318.                         (* test skipped *)
  319.                     end else begin
  320.                         TestOpenResFileDoubleProcess(routine, perm1, perm2);
  321.                     end; (* if *)
  322.                 end; (* for *)
  323.             end; (* for *)
  324.         end; (* for *)
  325.  
  326.     end; (* ActiveDoubleProcessTest *)
  327.  
  328.     var
  329.         testChar : char;
  330.         sysv : SInt32;
  331.         mach : SInt32;
  332. begin
  333.     writeln('TestOpenResFile');
  334.     if Gestalt(gestaltSystemVersion, sysv) <> noErr then begin
  335.         sysv := 0;
  336.     end; (* if *)
  337.     if Gestalt(gestaltMachineType, mach) <> noErr then begin
  338.         mach := 0;
  339.     end; (* if *)
  340.     writeln('  System Version = ', Ptr(sysv):1);
  341.     writeln('  Machine ID     = ', Ptr(mach):1);
  342.     writeln;
  343.  
  344.     gApplicationResFile := CurResFile;
  345.     
  346.     writeln('a) Single process test');
  347.     writeln('b) Passive double process test');
  348.     writeln('c) Active double process test');
  349.     writeln;
  350.     writeln('Enter the letter of the test you would like to run:');
  351.     
  352.     readln(testChar);
  353.     
  354.     writeln;
  355.     writeln;
  356.     
  357.     case testChar of
  358.         'a' :
  359.             SingleProcessTest;
  360.         'b' :
  361.             PassiveDoubleProcessTest;
  362.         'c' :
  363.             ActiveDoubleProcessTest;
  364.         otherwise
  365.             writeln('“', testChar, '” is not a valid test.');
  366.     end; (* case *)
  367.  
  368.     writeln('Done.  Press command-Q to Quit.');
  369. end. (* QStandardP68K *)
  370.